import fasttext

# 优化一
# 通过服务器终端进⾏简单的数据预处理
# 使标点符号与单词分离并统⼀使⽤⼩写字⺟
# cat cooking.stackexchange.txt | sed -e "s/\([.\!?,'/()]\)/ \1 /g" | tr "[:upper:]" "[:lower:]" > cooking.preprocessed.txt
# head -n 12404 cooking.preprocessed.txt > cooking.train
# tail -n 3000 cooking.preprocessed.txt > cooking.valid

# 优化二
# 增加train_supervised方法中的参数epoch来增加训练轮数，默认的轮数是5次

# 优化三
# 调整学习率，默认的学习率（lr）是0.1

# 优化四
# 增加n-gram特征，wordNgrams来添加n-gram特征，默认是1，我们这里设置为2，这些特征帮助模型捕捉前后词汇之间的关联

# 优化五
# 修改损失计算方式，修改loss来修改损失计算方式（等效于输出层的结构）

# 优化六
# 自动超参数调优，手动调节和寻找超参数是非常困难的，因为参数之间可能相关，并且不同数据集需要的超参数也不同
# autotuneValidationFile参数进行自动超参数调优

# 优化七
# 损失计算方式为ova，表示one vs all。在同一语料下同时训练多个二分类模型

# model = fasttext.train_supervised(
#     input="cooking.train",
#     epoch=25,
#     lr=1.0,
#     wordNgrams=2,
#     loss="hs"
# )

# model = fasttext.train_supervised(
#     input="cooking.train",
#     autotuneValidationFile="cooking.valid",
#     autotuneDuration=300
# )

# model = fasttext.train_supervised(
#     input="cooking.train",
#     epoch=25,
#     lr=0.2,
#     wordNgrams=2,
#     loss="ova"
# )
model = fasttext.load_model("./model_cooking.bin")

val = model.predict("Which baking dish is best to bake a banana bread?", k=-1, threshold=0.5)
print(val)

val = model.predict("Why not put knives in the dishwasher?", k=-1, threshold=0.1)
print(val)

# 我们看到模型精度和召回率表现都很差，接下来我们讲学习如何进行优化
val = model.test("cooking.valid", k=-1, threshold=0.5)
print(val)

model.save_model("./model_cooking.bin")